AI 초보자의 LLM 공부 기록 두 번째

AI 초보자의 LLM 공부 기록 두 번째

LLM에 대하여 초보자의 시선으로 알아본 내용을 기록한 글 그 두 번째입니다.
Clock Icon2024.09.26

안녕하세요 클래스메소드의 이수재입니다.
저번 글에 이은 두 번째 글입니다.
https://dev.classmethod.jp/articles/sujae-study-of-llm-1/
이 시리즈는 쉽고 빠르게 익히는 실전 LLM이라는 책을 베이스로 공부한 내용을 글로 남기는 것이 목적입니다.

텍스트 임베딩(Text Embedding)

단어나 구문을 맥락적 의미를 기반으로 다차원 공감에서 기계가 읽을 수 있는 수치 벡터로 표현하는 방법입니다.
벡터들의 거리는 코사인 유사도 (cosine similarity) 혹은 유클리드 거리 (Euclidean distance)로 표현하는 경우가 많습니다.
이 둘의 차이에 대해서는 다음 글을 참고해주세요.
https://specialscene.tistory.com/48

유사한 텍스트의 벡터는 서로 가깝고 서로 다른 텍스트의 벡터는 멀리 있어야 합니다.
예로 들면 king이라는 단어는 queen이나 man같은 단어와는 거리가 가까우면서 woman이라는 단어와는 거리가 멀어야 좋다는 뜻입니다.[1]

텍스트 임베딩을 이용하면 어떤 것이 가능한지는 책의 표현을 빌리도록 하겠습니다.

이러한 텍스트 임베딩을 이용하면 언어 사용에 관한 풍부한 정보를 활용하여 LLM의 사전 훈련과 파인튜닝이 기반이 되는 애플리케이션을 거의 무한하게 구축할 수 있습니다.

딥러닝과 임베딩에 관해서는 아래 글을 읽어보시는 것을 추천합니다.

https://channel.io/ko/blog/tech-ai-wordembebbing
https://www.elastic.co/kr/what-is/word-embedding

비대칭적 의미 기반 검색이란

의미 기반 검색이란

사용자 쿼리의 의미와 맥락을 이해하고 데이터 베이스에 저장되어 있는 의미 및 맥락과 대조할 수 있습니다.
이러한 시스템은 정확한 키워드나 n-gram[2]에 의존하지 않고 사전 훈련된 LLM을 이용하여 쿼리와 정보의 뉘앙스를 비교 및 이해합니다.
즉, 우리가 무엇을 검색하려는지 의미를 파악하고 검색한다 라고 이해하면 될 것 같습니다.

여기에서 말하는 비대칭 이란

우리가 검색하는 쿼리와 시스템이 검색해야하는 문서(데이터베이스) 및 정보가 불균형하다는 뜻입니다.

비대칭 의미 기반 검색 시스템은 사용자가 원하는 것에 대해 쿼리에 정확한 단어를 사용하지 않더라도 정확한 검색 결과를 얻을 수 있습니다.
사용자의 쿼리에 높은 가중치를 주기 보다는 LLM의 학습에 의존합니다.
즉, 위에서 설명한 대로 무엇을 검색하려는지 의미를 파악하고 이를 바탕으로 정보를 검색하기 때문입니다.

비대칭적 의미 기반 검색 시스템의 흐름

  1. 문서 저장
    임베딩을 위한 문서에 대해 전처리 한 후 저장하고, 텍스트 임베딩을 생성한 후, 임베딩 된 문서를 데이터베이스에 저장합니다.
  2. 문서 검색
    사용자에게 쿼리를 입력받으면 임베딩 유사도를 통해 후보가 될 문서를 검색합니다.
    필요에 따라 후보 문서의 순위를 재순위화 한 후, 최종 결과를 사용자에게 반환합니다.

텍스트 임베더

의미 기반 검색 시스템에 대하여 알아보았으니 이어서 LLM을 위한 구성 요소에 대하여 알아보겠습니다.

의미 기반 검색 시스템의 핵심은 텍스트 임베더(Text Embedder)입니다.
텍스트 문서나 단어 또는 구문을 받아 벡터로 변환하는 작업을 하며 텍스트마다 고유하며 구문의 맥락적 의미를 잘 포착해야 합니다.

텍스트 임베더에 따라 텍스트를 벡터로 표현하는 품질이 달라지므로 중요합니다.
클로즈드 소스와 오픈 소스 임베딩 모델 등을 활용할 수 있습니다.

OpenAI의 임베딩 엔진

OpenAI는 클로즈드 임베딩 모델을 제공하고 있습니다.
OpenAI에서의 임베딩은 벡터의 크기(길이)를 기본적으로 1로 정규화 합니다.
따라서 코사인 유사도가 내적과 동일하며, 코사인 유사도가 유클리드 거리가 동일한 순위의 결과를 가져옵니다.

오픈 소스

매해 수많은 오픈 소스 임베딩 모델이 공개되고 있습니다.
어떤 모델이 많이 쓰이는지 혹은 가장 적합할지는 다음 글을 참고해주세요.
https://ko.upstage.ai/feed/insight/top-open-source-llms-2024

오픈 소스 모델은 클로즈드 소스 모델보다 더 많은 맞춤화와 파인튜닝을 필요로 할 수 있지만 임베딩 과정에 대한 더 큰 유연성과 제어를 제공합니다.

문서 청킹

문서 청킹이란 큰 문서를 임베딩하기 위해 더 작고 관리 가능한 청크로 나누는 것을 의미합니다.
전체 문서를 단일 벡터로 임베딩하는 것은 실용적이지 않기 때문에 적절한 크기로 청킹하는 작업이 필요합니다.

이 글에서 소개하는 청킹 이외에도 다음 글을 참고하시면 좋습니다.
https://www.jiniai.biz/2023/10/21/llm-어플리케이션을-위한-chunking-strategies/

최대 토큰 범위 분할

청킹을 구현하는 방법으로 주어진 최대 크기의 청크로 문서를 나누는 것을 포함하여 최대 토큰 범위 분할이 있습니다.
이 방법은 텍스트의 의미를 고려하지 않고 정해진 숫자 만큼 청크로 나누기 때문에 청크 사이에 텍스트가 잘려버려서 문맥이 분리될 수도 있습니다.

이를 고려하여 토큰이 청크 사이에 공유되도록(각 청크의 처음과 끝의 토큰이 겹치도록) 범위를 설정할 수 있습니다. 이렇게 하면 더 높은 정확도와 대기시간을 얻을 수 있습니다.

구분 기호 찾기

페이지 분리나 단락 사이의 새로운 줄과 같은 자연 구분 기호를 기준으로 청킹하는 방법입니다.
중복 되는 토큰이 줄어들고 문맥이 더욱 자연스러워 질 수 있습니다.

클러스터링을 사용하여 의미 기반 문서 생성하기

의미적으로 유사한 작은 정보 청크를 결합하여 새로운 문서를 생성하는 방법입니다.

이 방법은 의미적으로 더 연관성이 있는 청크를 생성하지만 예상 밖으로 내용의 일부가 주변 텍스트와 맥락에서 벗어나는 경우가 있습니다. 따라서 청크들이 서로 관련이 없을 때, 즉 청크들이 서로 독립적일 때 잘 작동합니다.

벡터 데이터베이스

청킹을 어떻게 할지 결정한 후에는 벡터를 저장할 데이터베이스를 정해야합니다.[3]

벡터 데이터 베이스로는 파인콘, 크로마 등이 있으며 RDBMS를 이용하는 경우도 있습니다.
자주 사용되는 데이터베이스의 순위는 다음을 참고해주세요.
https://db-engines.com/en/ranking/vector+dbms

책에서도 그렇지만 처음에는 파인콘을 사용하는 것을 많이 권장하는 것 같습니다.

검색 결과 재순위화

벡터 데이터베이스로부터 유사도 비교를 사용하여 쿼리에 대한 잠재적인 결과를 검색한 후에는 비대칭적 의미 기반 검색에서 설명했듯이 사용자에게 가장 관련된 결과가 제시되도록 순위를 다시 지정하는 것이 유용한 경우가 많습니다.
이를 재순위화 라고 합니다.

결과를 재순위화하는 한 가지 방법으로는 크로스 인코더를 사용하는 것입니다.
크로스 인코더란 두 개의 입력을 받아 두 번째로 입력 받은 쿼리가 첫 번째 쿼리가 얼마나 관련이 있는지를 점수로 예측하는 트랜스포머 모델의 한 유형입니다.
텍스트 조각을 미리 벡터로 임베딩하고 나중에 쿼리가 주어지면 이를 검색하는 바이 인코더와는 다른 유형입니다.

크로스 인코더를 사용하여 검색 결과를 재순위화하면 개별 키워드만이 아닌 전체 문맥을 고려한 결과를 얻을 수 있습니다.

재순위화의 다른 옵션으로는 BM25와 같은 방법이 있습니다.
BM25는 문서 내 쿼리 용어의 빈도에 따라 결과를 순위화하고 용어의 근접성과 문서에서의 등장 빈도를 고려합니다.
크로스 인코더를 활용하는 방법과는 다르게 문맥 전체를 고려하지는 않지만 검색 결과의 전반적인 관련성을 향상시키는데 유용한 방법입니다.

API

마지막 구성요소로는 사용자가 문서에 접근할 수 있도록 해주는 API가 있습니다.
파이썬을 이용할 때 API를 직접 만드는 것도 가능하겠지만 FastAPI와 같은 오픈 소스 프레임워크를 이용하는 것도 가능합니다.

마무리

책의 내용을 기반으로 챕터 2까지 LLM의 요소인 텍스트 임베딩에 대해서 알아보았습니다.

이 글에서 알아본 비대칭적 의미 기반 검색의 흐름과 구성 요소를 결합하여 정리하자면 다음과 같습니다.

문서 저장

  1. 임베딩을 위한 문서 저장 : 관리하기 쉽게 하기 위해 청킹
  2. 의미 정보를 인코딩하기 위해 임베딩 생성 : OpenAI의 다른 임베딩 모델 사용
  3. 쿼리가 주어졌을 떄 검색할 수 있도록 임베딩을 저장하기 위한 데이터베이스 : 파인콘 등

문서 검색

  1. 사용자가 이용할 수 있도록 API를 제공 : FastAPI
  2. 후보 문서 검색 : OpenAI의 임베딩(쿼리의 분석) + 파인콘(검색 대상)
  3. 필요에 따라 재순위화 : 크로스 인코더(예:OpenAI의 크로스 인코더 사용)
  4. 결과 반환 : FastAPI

긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 must01940 지메일로 보내주시면 감사합니다.

참고 문서

脚注
  1. 출처 : [AI] 텍스트 임베딩의 소개 - 1편: 단어 임베딩(채널톡) ↩︎

  2. N-gram은 텍스트나 연설에서 N개의 연속적인 항목(문자, 음절, 단어 등)의 시퀀스를 말합니다. n gram 에 대한 상세한 설명은 여기를 참고해주세요. ↩︎

  3. 이 글에서 소개하는 클라우드 환경이 아닌 로컬에서 구현하는 것도 가능합니다. ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.